package A2018;


/*
 现在小葱给了你 n 个数，希望你从这 n 个数中找到三个数，使得这三个数的和是 K 的倍数，且这个和最大。数据保证一定有解。
【输入格式】
从标准输入读入数据。
第一行包括 2 个正整数 n, K。
第二行 n 个正整数，代表给定的 n 个数。
【输出格式】
输出到标准输出。
输出一行一个整数代表所求的和。
【样例输入】
4 3
1 2 3 4
【样例输出】
9
【样例输入】
6 3
3 6 9 1 4 7
【样例输出】
9
【样例解释】
选择2、3、4。
【数据约定】
对于 30% 的数据，n <= 100。
对于 60% 的数据，n <= 1000。
对于另外 20% 的数据，K <= 10。
对于 100% 的数据，1 <= n <= 10^5, 1 <= K <= 10^3，给定的 n 个数均不超过 10^8。
资源约定：
峰值内存消耗（含虚拟机） < 256M
CPU消耗 < 1000ms
解题思路： one[n%k]=i;——i为a[i]的下标，two[n%k]=j;——j为a[j]的下标，three[n%k]=z;——z为a[z]的下标
令y1=n%k其他同理, 即 y1+y2+y3=sum%k==0,再由a[one[y1]]+a[two[y2]]+a[three[y3]]=max
 */
import java.util.Scanner;
public class _9_倍数问题 {//正确
	private static int n;
	private static int m;
	private static int sum;
	private static int[][] arr = new int[4][1000];// 记录三组对于k的余数

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		for (int i = 0; i < n; i++) {
			int num = sc.nextInt();
			int t = num % m;
			if (arr[1][t] < num) {
				arr[3][t] = arr[2][t];
				arr[2][t] = arr[1][t];
				arr[1][t] = num;// 当余数相同时，选择两者值大的一个
			} else if (num > arr[2][t]) {
				arr[3][t] = arr[2][t];
				arr[2][t] = num;
			} else {
				arr[3][t] = Math.max(arr[3][t], num);
			}
		}
		for (int i = 0; i <= m; i++) {
			for (int j = i; j <= m; j++) {
				int k=(2*m-i-j)%m;
				int m1=arr[1][i];
				int m2=0,m3 = 0;
				if(i==j) {
					m2=arr[2][i];
					if(k==j) {
						m3=arr[3][k];
					}else {
						m3=arr[1][k];
					}
				}else {
					m2=arr[1][j];
					if(k==i||k==j) m3=arr[2][k];
					else m3=arr[1][k];
				}
				if(m1+m2+m3>sum&&(m1+m2+m3)%m==0) {
					sum=m1+m2+m3;
				}
			}
		}
		System.out.println(sum);
	}

}
